package suda;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;
import suda.entity.Card;
import suda.entity.Emp;
import suda.entity.Order;
import suda.entity.User;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class TestPOI {
    
    //生成所有记录
    public List<User> getUsers(){
        List<User> users = new ArrayList<User>();
        for (int i = 0; i < 5; i++) {
            User user = new User();
            user.setId(String.valueOf(i));
            user.setName("苏大:" + i);
            user.setAge(10 + i);
            user.setBir(new Date());
            if(i % 2 == 0){
                user.setStatus("0");
                user.setHobby(Arrays.asList("打篮球","看书"));
            }else {
                user.setStatus("1");
                user.setHobby(Arrays.asList("写代码","看电影"));
            }

            //身份信息
            Card card = new Card();
            card.setNo("320924199603204113");
            card.setAddress("北京市朝阳区国贸大厦3层507A");
            user.setCard(card);

            //订单信息
            List<Order> orders = new ArrayList<>();
            orders.add(new Order("12","超短裙"));
            orders.add(new Order("13","碎花裙"));
            orders.add(new Order("14","连衣裙"));
            user.setOrders(orders);

            //头像信息
            user.setPhoto("D:/导出测试/头像.jpg");

            users.add(user);
        }
        return users;
    }

    //导出Excel 普通数据量
    @Test
    public void testExport() throws IOException {
        //获取数据
        List<User> users = this.getUsers();
        /*
            导出Excel
                参数1: ExportParams 导出配置对象,第一个参数将出现在内容的第一行,第二个参数为sheet页的名称
                参数2: 导出的类型
                参数3: 导出数据集合
         */
        Workbook workBook = ExcelExportUtil.exportExcel(new ExportParams("用户信息列表", "用户信息"), User.class, users);
        //通过流写入指定位置
        FileOutputStream fileOutputStream = new FileOutputStream("D:/导出测试/normal.xls");
        workBook.write(fileOutputStream);
        //关闭资源
        fileOutputStream.close();
        workBook.close();
    }

    /*
        导出Excel 大数据量
            大数据导出是当导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对内存和CPU都产生压力
            这个时候需要像分页一样处理导出分段写入Excel缓解Excel的压力
            注意: 最好大量数据进行分页处理,每次导出数据最好不要超过1W条记录
     */
    @Test
    public void testBigExport() throws IOException{
        //获取数据
        List<User> users = this.getUsers();
        /*
            导出Excel
                参数1: ExportParams 导出配置对象,第一个参数将出现在内容的第一行,第二个参数为sheet页的名称
                参数2: 导出的类型
                参数3: 导出数据集合
         */
        Workbook workBook = ExcelExportUtil.exportBigExcel(new ExportParams("用户信息列表", "用户信息"), User.class, users);
        //通过流写入指定位置
        FileOutputStream fileOutputStream = new FileOutputStream("D:/导出测试/big.xls");
        workBook.write(fileOutputStream);
        //关闭资源
        fileOutputStream.close();
        workBook.close();
    }

    /*
        导入Excel数据
            - 读取指定的sheet
                比如要读取上传得第二个sheet 那么需要把startSheetIndex = 1 就可以了
            - 读取几个sheet
                比如读取前2个sheet,那么 sheetNum=2 就可以了
            - 读取第二个到第五个sheet
                设置 startSheetIndex = 1 然后sheetNum = 4
            - 读取全部的sheet
                sheetNum  设置大点就可以了
            - 判断一个Excel是不是合法的Excel
                importFields 设置下值,就是表示表头必须至少包含的字段,如果缺一个就是不合法的excel,不导入
     */
    @Test
    public void testImport() throws Exception {
        FileInputStream fileInputStream = new FileInputStream("D:/导出测试/模板.xls");
        System.out.println(fileInputStream.toString());

        /*
            导入配置对象,包含了要导入的Excel文件的相关信息,符合导入的Excel格式后才能正常的解析数据
         */
        ImportParams importParams = new ImportParams();
        importParams.setTitleRows(1); //标题列占几行
        importParams.setHeadRows(2); //header列占几行
//        importParams.setImportFields(new String[]{"姓名","家庭住址"});
        /*
            导入Excel
                参数1: 导入的Excel文件流
                参数2: 导入类型
                参数3: 导入的配置对象
         */
        List<Emp> emps = ExcelImportUtil.importExcel(fileInputStream, Emp.class, importParams);
        emps.forEach(System.out::println);

        fileInputStream.close();
    }
}
